/*
 * Copyright (C) 2008 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.android;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


/********* DBAdapter class
         * Defines all the methods for database operations
         * Allows for insertion, updation and deletion of entries
         */


public class DBAdapter {

    public static final String KEY_TITLE = "title";
    public static final String KEY_NAME = "name";
    public static final String KEY_KWD="kwd";
    public static final String KEY_PHONE="phone";
    public static final String KEY_HIT="hit";

    private static final String TAG = "NotesDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;
    private static final String DATABASE_CREATE =
            "create table notes (_id integer primary key autoincrement, "
                    + "title text not null, name text, kwd text, phone text, hit integer not null);";

    private static final String DATABASE_NAME = "data";
    private static final String DATABASE_TABLE = "notes";
    private static final int DATABASE_VERSION = 2;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS notes");
            onCreate(db);
        }
    }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param ctx the Context within which to work
     */
    public DBAdapter(Context ctx) {
        this.mCtx = ctx;
    }
    

    /**
     * Open the database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * Throws SQLException if the database could be neither opened or created
     */
    public DBAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }
    
    /******** close()
            * Close the database
     */
    
    public void close() {
        mDbHelper.close();
    }


    /************** createNote()
     			  * Creates a new row entry for the database
     			  * Adds the populated row at the end
     			  */ 
     			  
    public long createNote(String keyval, String name, String phoneno, String id) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TITLE, id);
        initialValues.put(KEY_NAME, name);
        initialValues.put(KEY_PHONE, phoneno);
        initialValues.put(KEY_KWD, keyval);
        initialValues.put(KEY_HIT, 0);
        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    /************** deleteNote()
     			  * Delete the note with the given rowId
     			  */
   
    public boolean deleteNote(String keyid) {

        return mDb.delete(DATABASE_TABLE, KEY_TITLE + "=" + keyid, null) > 0;
    }

    /************** fetchAllNotes()
     			  * Return a Cursor for all the rows
     			  * Data returned from columns hit, title, name and id
     			  */
    
    public Cursor fetchAllNotes() {

        return mDb.query(DATABASE_TABLE, new String[] {KEY_HIT, KEY_TITLE,
                KEY_NAME, KEY_PHONE}, null, null, null, null, null);
    }

    /************* fetchNote()
     			 * Returns a cursor to a row which matches a keyword
     			 */
         
    public Cursor fetchNote(String kwd) throws SQLException {

        Cursor mCursor = null;
        boolean exflag=false;
        
        try {
              mCursor= mDb.query(true, DATABASE_TABLE, new String[] {
                        KEY_NAME, KEY_PHONE, KEY_TITLE, KEY_HIT}, KEY_KWD + " LIKE '" +kwd+"'", null,
                        null, null, KEY_HIT+" DESC", null);
                 }catch(Exception e) {
           // Log.i("err",e.toString());
        	exflag=true;
        }
        
        if (mCursor.getCount()>0 && !exflag) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    /************* updateNote()
     			 * Updates the hit count of a row which matches the title and keyword   
     			 * If no entry, then creates a new row by calling createNote()  
     */
    
    public boolean updateNote(String keytitle, String name, String phone, String keywd) {
        ContentValues args = new ContentValues();
        int hitc=0;
        boolean exflag=false;
        Cursor mCursor=null;
       
        try {
        	mCursor=
        		mDb.query(true, DATABASE_TABLE, new String[] {KEY_HIT,
                    KEY_TITLE, KEY_NAME, KEY_PHONE}, KEY_TITLE + "='" + keytitle+"' AND "+KEY_KWD+"='" + keywd+"'", null,
                    null, null, null, null);
        }catch(Exception e) {
        	//Log.i("upd",e.toString());
        	exflag=true;
        }
       if (mCursor.getCount()<=0 || exflag) {
        	createNote(keywd, name, phone, keytitle);
            return false;            
        }
        else {
        	mCursor.moveToFirst();
        	hitc=mCursor.getInt(mCursor.getColumnIndex(KEY_HIT))+1;
        	args.put(KEY_HIT, hitc);
        	return mDb.update(DATABASE_TABLE, args, KEY_TITLE + "='" + keytitle+"'", null) > 0;
           }
  }

    
    /********** deleteAll() 
     		  *  Deletes all the rows in the database
     */
    
    public void deleteAll() {
    	mDb.delete(DATABASE_TABLE, null, null);
    }
    
	
}
